package com.gobang.modules.player;

import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 在线玩家管理服务
 */
@Slf4j
@Service
public class PlayerService {

    // 用户ID到Channel的映射
    private final Map<Long, ChannelHandlerContext> userId2CtxMap = new ConcurrentHashMap<>();

    // Channel到用户ID的映射
    private final Map<ChannelHandlerContext, Long> ctx2UserIdMap = new ConcurrentHashMap<>();

    /**
     * 添加玩家连接
     */
    public void addPlayer(Long userId, ChannelHandlerContext ctx) {
        userId2CtxMap.put(userId, ctx);
        ctx2UserIdMap.put(ctx, userId);
        log.info("玩家上线: userId={}", userId);
    }

    /**
     * 移除玩家连接(比如:掉线)
     */
    public Long removePlayer(ChannelHandlerContext ctx) {
        Long userId = ctx2UserIdMap.remove(ctx);
        if (userId != null) {
            userId2CtxMap.remove(userId);
            log.info("玩家下线: userId={}", userId);
        }
        return userId;
    }

    /**
     * 根据Channel获取用户ID
     */
    public Long getUserId(ChannelHandlerContext ctx) {
        return ctx2UserIdMap.get(ctx);
    }

    /**
     * 根据用户ID获取Channel
     */
    public ChannelHandlerContext getChannel(Long userId) {
        return userId2CtxMap.get(userId);
    }

    /**
     * 检查用户是否在线
     */
    public boolean isOnline(Long userId) {
        ChannelHandlerContext ctx = userId2CtxMap.get(userId);
        return ctx != null && ctx.channel().isActive();
    }

    /**
     * 获取在线玩家数量
     */
    public int getOnlineCount() {
        return userId2CtxMap.size();
    }
}
